/**
 * 
 */
package cl.duocap.refaxion.dao;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import cl.duocap.refaxion.dto.RepuestoDTO;
import cl.duocap.refaxion.dto.TipoRepuestoDTO;





/**
 * @author rentonx
 *
 */
public class RepuestoDAO {

	/**
	 * 
	 */
	private Connection conexion;
	
	
	public List<RepuestoDTO> obtenerTodosRepuestos(){
		
		List<RepuestoDTO> listaRepuestos = new ArrayList<RepuestoDTO>();
		ResultSet rset = null;
		try{
		
			CallableStatement cstmt = conexion.prepareCall("{ call paConListaRepuestos()}");
			
			
			rset = cstmt.executeQuery();
			RepuestoDTO repuesto =  null;
			
			while (rset.next()) {
				
				
				repuesto = new RepuestoDTO();
				repuesto.setIdRepuesto(rset.getInt("idRepuesto"));
				repuesto.setNombreRepuesto(rset.getString("nombreRepuesto"));
				repuesto.setDescripcion(rset.getString("descripcion"));			
				repuesto.setMarca(rset.getString("marca"));
				repuesto.setPrecioRepuesto(rset.getInt("precioRepuesto"));
				repuesto.setIdTipoRepuesto(rset.getInt("idTipoRepuesto"));
				repuesto.setAlternativo(rset.getInt("alternativo"));
				repuesto.setIdEquivalencia(rset.getInt("idEquivalencia"));
				repuesto.setEstado(rset.getInt("estado"));
				repuesto.setFechaIngreso(rset.getString("fechaIngreso"));
				repuesto.setNombreTipoRepuesto(rset.getString("nombreTipoRepuesto"));
				if(rset.getInt("alternativo") == 0){
					repuesto.setEsAlternativo("Original");
				}else{
					repuesto.setEsAlternativo("Alternativo");
				}


				listaRepuestos.add(repuesto);	
				
			}
			cstmt.close();
		} catch (Exception ex) {
			throw new RuntimeException("error: listar respuestos.",ex); 
		}finally {
			   
	        try{
	       	 	  conexion.close();
	       	 
	           }catch (Exception ex){
	           
	           }
	           try{
	        		conexion.close();
	           
	        	   }catch (Exception ex){      
	        	   }
       
	   	}	
		return listaRepuestos;
	}
	
	
	
	public List<TipoRepuestoDTO> listarTiposRepuestos(){
		
		List<TipoRepuestoDTO> listaTipoRepuesto = new ArrayList<TipoRepuestoDTO>();
        ResultSet rs= null;
        
		try {

			CallableStatement cstmt = conexion.prepareCall("{ call paConRefaxionListaTiposRepuestos()}");
			rs = cstmt.executeQuery();
			
			 while (rs.next()){
                 
				    TipoRepuestoDTO tipoRepuesto = new TipoRepuestoDTO();
				    tipoRepuesto.setIdTipoRepuesto(rs.getInt("idTipoRepuesto"));
				    tipoRepuesto.setNombreTipoRepuesto(rs.getString("nombreTipoRepuesto"));
				    tipoRepuesto.setDescripcionTipoRepuesto(rs.getString("descripcionTipoRepuesto"));
				    listaTipoRepuesto.add(tipoRepuesto);
	            	
	          }

	        } catch (SQLException ex) {
	             throw new RuntimeException("listar Repuestos.",ex);                    
	        }finally {
	             try{
	                rs.close();
	                conexion.close();
	            }catch (Exception ex){
	                
	            }
	            try{
	            	rs.close();
	                conexion.close();
	            }catch (Exception ex){
	                
	            }
	            
	        }
		
		return listaTipoRepuesto;
	}
	
	
	public boolean registrarRepuestoNuevo(RepuestoDTO repuestoNuevo){
		
		try {
			
		
				CallableStatement cstmt = conexion.prepareCall("{ call paInsRefaxionRegistrarRepuesto(?,?,?,?,?,?,?,?,?)}");
		
				int i = 1;

				cstmt.setString(i++,repuestoNuevo.getNombreRepuesto());
				cstmt.setString(i++,repuestoNuevo.getDescripcion());
				cstmt.setString(i++,repuestoNuevo.getMarca());
				cstmt.setInt(i++,repuestoNuevo.getPrecioRepuesto());
				cstmt.setInt(i++,repuestoNuevo.getIdTipoRepuesto());
				cstmt.setInt(i++,repuestoNuevo.getAlternativo());
				cstmt.setInt(i++,repuestoNuevo.getIdEquivalencia());
				cstmt.setInt(i++,1); //cstmt.setInt(i++,usuarioNuevo.getEstado());
				cstmt.setString(i++,repuestoNuevo.getFechaIngreso());

				
				
				cstmt.executeUpdate();
				cstmt.close();
				
				return true;
				
		
		
		 } catch (SQLException ex) {
             throw new RuntimeException("registrar repuesto.",ex);     
            
        }finally {
             try{
            	 conexion.close();
            }catch (Exception ex){
                
            }
            try{
                conexion.close();
            }catch (Exception ex){
            	 return false;
            }
            
        }
		
	}
	
	
	public boolean eliminarRepuesto(int idRepuesto){

		try {
			
			
			CallableStatement cstmt = conexion.prepareCall("{ call paUpdRefaxionEliminarRepuesto(?)}");
			int i=1;
			cstmt.setInt(i++,idRepuesto);
			cstmt.executeUpdate();
			cstmt.close();
			
		 } catch (SQLException ex) {
	         throw new RuntimeException("error: eliminar repuesto.",ex);   
	         
	    }finally {
	         try{
	        	 conexion.close();
	        	 return false;
	        }catch (Exception ex){
	            
	        }
	        try{
	        	
	            conexion.close();
	            return false;
	        }catch (Exception ex){
	            
	        }
	        
	    }	
		return true;
			
	}
	
	public RepuestoDTO traerRepuestoEditar(int idRepuesto) {

		
		   ResultSet rset = null;
		   RepuestoDTO repuestoEditar = null;
		   
			try {
					
					
					CallableStatement cstmt = conexion.prepareCall("{ call paUpdRefaxionTraerRepuestoEditar(?)}");
					
					int i = 1;
					cstmt.setInt(i++,idRepuesto);
					rset = cstmt.executeQuery();

					while (rset.next()) {
						
						repuestoEditar = new RepuestoDTO();
						repuestoEditar.setIdRepuesto(rset.getInt("idRepuesto"));
						repuestoEditar.setNombreRepuesto(rset.getString("nombreRepuesto"));
						repuestoEditar.setDescripcion(rset.getString("descripcion"));
						repuestoEditar.setMarca(rset.getString("marca"));			
						repuestoEditar.setPrecioRepuesto(rset.getInt("precioRepuesto"));
						repuestoEditar.setIdTipoRepuesto(rset.getInt("idTipoRepuesto"));
						repuestoEditar.setAlternativo(rset.getInt("alternativo"));
						repuestoEditar.setIdEquivalencia(rset.getInt("idEquivalencia"));
						repuestoEditar.setEstado(rset.getInt("estado"));
						repuestoEditar.setFechaIngreso(rset.getString("fechaIngreso"));
						repuestoEditar.setPrecioRepuestoFinal(rset.getInt("precioRepuesto"));
						
						 SimpleDateFormat formatoDelTexto = new SimpleDateFormat("dd-MM-yyyy");
						 String strFecha = repuestoEditar.getFechaIngreso();
						 Date fecha = null;
						 try {
							 fecha = formatoDelTexto.parse(strFecha);
						 } catch (Exception ex) {
							 ex.printStackTrace();
						 }
						 
						 repuestoEditar.setFechaIngresoTrans(fecha);
					
					}
					cstmt.close();
				
				
				
			   } catch (SQLException ex) {
				   
			        throw new RuntimeException("error traer repuesto editar.",ex);   
			        
				   }finally {
					   
				        try{
				       	 	  conexion.close();
				       	 
				           }catch (Exception ex){
				           
				           }
				           try{
				        		conexion.close();
				           
				        	   }catch (Exception ex){      
				        	   }
			       
				   	}
//
//					 SimpleDateFormat formatoDelTexto = new SimpleDateFormat("dd-MM-yyyy");
//					 String strFecha = repuestoEditar.getFechaIngreso();
//					 Date fecha = null;
//					 try {
//		
//					     fecha = formatoDelTexto.parse(strFecha);
//		
//					 } catch (ParseException ex) {
//		
//					     ex.printStackTrace();
//		
//					 }
//			
//					 repuestoEditar.setFechaIngresoTrans(fecha);

			return repuestoEditar;
		
	
	}
	
	//metodo para la edicion de la informacion de un repuesto
	public boolean editarRepuesto(RepuestoDTO repuestoEditar){

		try {
				CallableStatement cstmt = conexion.prepareCall("{ call paUpdRefaxionEditarRepuesto(?,?,?,?,?,?,?,?,?,?)}");
		
				int i = 1;
				cstmt.setInt(i++,repuestoEditar.getIdRepuesto());
				cstmt.setString(i++,repuestoEditar.getNombreRepuesto());
				cstmt.setString(i++,repuestoEditar.getDescripcion());
				cstmt.setString(i++,repuestoEditar.getMarca());
				cstmt.setInt(i++,repuestoEditar.getPrecioRepuesto());
				cstmt.setInt(i++,repuestoEditar.getIdTipoRepuesto());
				cstmt.setInt(i++,repuestoEditar.getAlternativo());
				cstmt.setInt(i++,repuestoEditar.getIdEquivalencia());
				cstmt.setInt(i++,repuestoEditar.getEstado());
				cstmt.setString(i++,repuestoEditar.getFechaIngreso());				
				
				cstmt.executeUpdate();
				cstmt.close();
				
		} catch (Exception ex) {
			throw new RuntimeException("error en DAO: editar respuesto.",ex); 
		}finally {
			   
	        try{
	       	 	  conexion.close();
	       	 
	           }catch (Exception ex){
	           
	           }
	           try{
	        		conexion.close();
	           
	        	   }catch (Exception ex){      
	        	   }
       
	   	}			
				return true;		
	}	
	
	
	
	public RepuestoDAO() {
		
	}

	public Connection getConexion() {
		return conexion;
	}

	public void setConexion(Connection conexion) {
		this.conexion = conexion;
	}
	
	

}
